Add EventDrop#created_at and drop (skip_)created_at from EventFormattingAgent.

Akinori MUSHA лет %!s(int64=9): %!d(string=назад)
Родитель
Сommit
ceea91fe2a

+ 9 - 7
app/models/agents/event_formatting_agent.rb

@@ -25,9 +25,14 @@ module Agents
25 25
 
26 26
           "instructions": {
27 27
             "message": "Today's conditions look like {{conditions}} with a high temperature of {{high.celsius}} degrees Celsius.",
28
-            "subject": "{{data}}"
28
+            "subject": "{{data}}",
29
+            "created_at": "{{created_at}}"
29 30
           }
30 31
 
32
+      Names here like `conditions`, `high` and `data` refer to the corresponding values in the Event hash.
33
+
34
+      The special key `created_at` refers to the timestamp of the Event, which can be reformatted by the `date` filter, like `{{created_at | date:"at %I:%M %p" }}`.
35
+
31 36
       The upstream agent of each received event is accessible via the key `agent`, which has the following attributes: #{''.tap { |s| s << AgentDrop.instance_methods(false).map { |m| "`#{m}`" }.join(', ') }}.
32 37
 
33 38
       Have a look at the [Wiki](https://github.com/cantino/huginn/wiki/Formatting-Events-using-Liquid) to learn more about liquid templating.
@@ -68,8 +73,6 @@ module Agents
68 73
 
69 74
       If you want to retain original contents of events and only add new keys, then set `mode` to `merge`, otherwise set it to `clean`.
70 75
 
71
-      By default, the output event will have a `created_at` field added as well, reflecting the original Event creation time.  You can skip this output by setting `skip_created_at` to `true`.
72
-
73 76
       To CGI escape output (for example when creating a link), use the Liquid `uri_escape` filter, like so:
74 77
 
75 78
           {
@@ -82,7 +85,7 @@ module Agents
82 85
     after_save :clear_matchers
83 86
 
84 87
     def validate_options
85
-      errors.add(:base, "instructions, mode, and skip_created_at all need to be present.") unless options['instructions'].present? && options['mode'].present? && options['skip_created_at'].present?
88
+      errors.add(:base, "instructions and mode need to be present.") unless options['instructions'].present? && options['mode'].present?
86 89
 
87 90
       validate_matchers
88 91
     end
@@ -92,11 +95,11 @@ module Agents
92 95
         'instructions' => {
93 96
           'message' =>  "You received a text {{text}} from {{fields.from}}",
94 97
           'agent' => "{{agent.type}}",
95
-          'some_other_field' => "Looks like the weather is going to be {{fields.weather}}"
98
+          'some_other_field' => "Looks like the weather is going to be {{fields.weather}}",
99
+          'created_at' => "{{created_at}}"
96 100
         },
97 101
         'matchers' => [],
98 102
         'mode' => "clean",
99
-        'skip_created_at' => "false"
100 103
       }
101 104
     end
102 105
 
@@ -110,7 +113,6 @@ module Agents
110 113
         opts = interpolated(event.to_liquid(payload))
111 114
         formatted_event = opts['mode'].to_s == "merge" ? event.payload.dup : {}
112 115
         formatted_event.merge! opts['instructions']
113
-        formatted_event['created_at'] = event.created_at unless opts['skip_created_at'].to_s == "true"
114 116
         create_event :payload => formatted_event
115 117
       end
116 118
     end

+ 2 - 0
app/models/event.rb

@@ -56,6 +56,8 @@ class EventDrop
56 56
       case key
57 57
       when 'agent'
58 58
         @object.agent
59
+      when 'created_at'
60
+        @object.created_at
59 61
       end
60 62
     end
61 63
   end

+ 21 - 0
db/migrate/20140730005210_convert_efa_skip_created_at.rb

@@ -0,0 +1,21 @@
1
+class ConvertEfaSkipCreatedAt < ActiveRecord::Migration
2
+  def up
3
+    Agent.where(type: 'Agents::EventFormattingAgent').each do |agent|
4
+      agent.options_will_change!
5
+      unless agent.options.delete('skip_created_at').to_s == 'true'
6
+        agent.options['instructions'] = {
7
+          'created_at' => '{{created_at}}'
8
+        }.update(agent.options['instructions'] || {})
9
+      end
10
+      agent.save!
11
+    end
12
+  end
13
+
14
+  def down
15
+    Agent.where(type: 'Agents::EventFormattingAgent').each do |agent|
16
+      agent.options_will_change!
17
+      agent.options['skip_created_at'] = (agent.options['instructions'] || {})['created_at'] == '{{created_at}}'
18
+      agent.save!
19
+    end
20
+  end
21
+end

+ 4 - 14
spec/models/agents/event_formatting_agent_spec.rb

@@ -9,6 +9,8 @@ describe Agents::EventFormattingAgent do
9 9
                 :message => "Received {{content.text}} from {{content.name}} .",
10 10
                 :subject => "Weather looks like {{conditions}} according to the forecast at {{pretty_date.time}}",
11 11
                 :agent => "{{agent.type}}",
12
+                :created_at => "{{created_at}}",
13
+                :created_at_iso => "{{created_at | date:'%FT%T%:z'}}",
12 14
             },
13 15
             :mode => "clean",
14 16
             :matchers => [
@@ -18,7 +20,6 @@ describe Agents::EventFormattingAgent do
18 20
                     :to => "pretty_date",
19 21
                 },
20 22
             ],
21
-            :skip_created_at => "false"
22 23
         }
23 24
     }
24 25
     @checker = Agents::EventFormattingAgent.new(@valid_params)
@@ -53,18 +54,12 @@ describe Agents::EventFormattingAgent do
53 54
       Event.last.payload[:content].should_not == nil
54 55
     end
55 56
 
56
-    it "should accept skip_created_at" do
57
-      @checker.receive([@event])
58
-      Event.last.payload[:created_at].should_not == nil
59
-      @checker.options[:skip_created_at] = "true"
60
-      @checker.receive([@event])
61
-      Event.last.payload[:created_at].should == nil
62
-    end
63
-
64 57
     it "should handle Liquid templating in instructions" do
65 58
       @checker.receive([@event])
66 59
       Event.last.payload[:message].should == "Received Some Lorem Ipsum from somevalue ."
67 60
       Event.last.payload[:agent].should == "WeatherAgent"
61
+      Event.last.payload[:created_at].should == @event.created_at.to_s
62
+      Event.last.payload[:created_at_iso].should == @event.created_at.iso8601
68 63
     end
69 64
 
70 65
     it "should handle matchers and Liquid templating in instructions" do
@@ -144,10 +139,5 @@ describe Agents::EventFormattingAgent do
144 139
       @checker.options[:mode] = ""
145 140
       @checker.should_not be_valid
146 141
     end
147
-
148
-    it "should validate presence of skip_created_at" do
149
-      @checker.options[:skip_created_at] = ""
150
-      @checker.should_not be_valid
151
-    end
152 142
   end
153 143
 end

+ 6 - 0
spec/models/event_spec.rb

@@ -85,6 +85,7 @@ describe EventDrop do
85 85
   before do
86 86
     @event = Event.new
87 87
     @event.agent = agents(:jane_weather_agent)
88
+    @event.created_at = Time.at(1400000000)
88 89
     @event.payload = {
89 90
       'title' => 'some title',
90 91
       'url' => 'http://some.site.example.org/',
@@ -111,4 +112,9 @@ describe EventDrop do
111 112
     t = '{{agent.name}}'
112 113
     interpolate(t, @event).should eq('SF Weather')
113 114
   end
115
+
116
+  it 'should have created_at' do
117
+    t = '{{created_at | date:"%FT%T%z" }}'
118
+    interpolate(t, @event).should eq('2014-05-13T09:53:20-0700')
119
+  end
114 120
 end